/**
 *  @brief Implementacja klasy Widget oraz kilku kontrolek.
 *
 *  Klasa Widget zapewnia interfejs oraz okresla sposob
 *  w jaki nowe kontrolki maja zostac utworzone. Ponad to
 *  dostarcza mechanizm reagowania na zdarzenia. Kazda
 *  kontrolka moze obslugiwac trzy rozne rodzaje zdarzen.
 * 
 *  @file Widget.cpp
 *  @author t0m_k
 *  @date 06.12.10
**/
#include "Widget.h"

namespace gui
{
	/**
	 *  @brief Tworzy warstwe, na ktorej widget zostanie
	 *  umieszczony oraz zachowuje jego parametry.
	 *  @param w Szerokosc widgetu.
	 *  @param h Wysokosc widgetu.
	**/
	Widget::Widget(Uint16 w, Uint16 h)
	{
		pixel = newWidgetLayer(w, h);
		if(!pixel)
			throw std::runtime_error("create widget");

		dimension.w = w;
		dimension.h = h;

		memset(callback, 0, E_COUNT*sizeof(callback_t));
	}

	/**
	 *  @brief Zwalnia pamiec zajmowana przez dany widget.
	**/
	Widget::~Widget()
	{
		if(pixel)
			SDL_FreeSurface(pixel);
	}
	
	/**
	 *  @brief Rejestruje funkcje obslugujaca dane zdarzenie.
	 *  @param ev Typ zdarzenia. 
	 *  @param cb Wskaznik na funkcje 'zwrotna'.
	**/
	void Widget::addEvent(Widget_e ev, callback_t cb)
	{
		callback[ev] = cb;
	}

	/**
	 *  @brief Wyrejestrowuje obsluge danego zdarzenia.
	 *  @param ev Typ zdarzenia.
	**/
	void Widget::delEvent(Widget_e ev)
	{
		callback[ev] = 0;
	}

	/**
	 *  @brief Wywoluje zdarzenie na rzecz danej kontrolki.
	 *  @param ev Typ zdarzenia.
	 *  @param ev_data Dane dostarczane ze zdarzeniem.
	**/
	void Widget::setEvent(Widget_e ev, Event_t ev_data) const
	{
		if(callback[ev])
			callback[ev](&ev_data);
	}
}
